科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE6新特性: XML API 与Web服务4

Java SE6新特性: XML API 与Web服务4

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。

作者:沈羽 来源:IT专家网 2008年5月9日

关键字: API XML Java SE 6 java

  • 评论
  • 分享微博
  • 分享邮件
清单 6. 地址信息文件

  

work contact-info
Location Shanghai-shuion-333
Postal 200020
Tel
fix 63262299
mobile 1581344454
Appellation Mr. Wang

  清单 7 为这个信息文件构造一个 DOM 树,并将其作为 transformer 的输入。

  清单 7. 构造 DOM 树 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

class ContentHandler extends DefaultHandler {

    @Override
    public void characters(char[] ch, int start, int length)
throws SAXException {
String name = new String(ch, start, length);
        System.out.print(name + "\t");
    }
}

public class DOMTest {

    /**
    * @param args
    * @throws TransformerException
    */
    public static void main(String[] args) {

        try {
            DocumentBuilderFactory documentfactory = DocumentBuilderFactory
                .newInstance();
            DocumentBuilder builder = documentfactory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element root = document.createElement("work-contact-info");

            Element loca = document.createElement("Location");
            loca.setTextContent("Shanghai-shuion-333");
            root.appendChild(loca);

            Element postal = document.createElement("Postal");
            postal.setTextContent("200020");
            root.appendChild(postal);

            Element tel = document.createElement("Tel");
            root.appendChild(tel);

            Element fix = document.createElement("fix");
            fix.setTextContent("63262299");
            tel.appendChild(fix);

            Element mobile = document.createElement("mobile");
            mobile.setTextContent("1581344454");
            tel.appendChild(mobile);

            Element appellation = document.createElement("Appellation");
            appellation.setTextContent("Mr. Wang");
            root.appendChild(appellation);

            document.appendChild(root);

            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer;
            transformer = tFactory.newTransformer();
            SAXResult result = new SAXResult();

            ContentHandler cHandler = new ContentHandler();
    result.setHandler(cHandler);
            transformer.transform(new DOMSource(document), result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 Java SE 6 SDK 提供了至少以上三种内置的处理 XML 文件的机制。它们分别是 Simple API for XML、Document Object Model 和 Streaming API for XML。其中 SAX 和 StAX 采用了相似的模型 —— 将 XML 文件建模为元素流,DOM 采用了树形模型。带来的结果是 SAX 和 StAX 运行时空间相对 DOM 紧凑。状态保持能力则依次 SAX -> StAX -> DOM 变强。特别值得一提的是 StAX 技术是最新引进的 XML 处理技术,它结合了 SAX 和 DOM 的优点。清单 8 给出了一个粗略度量 SAX、StAX、DOM 三个框架解析同一个 XML 文件的运行效率的代码。

  清单 8. 度量 XML 解析框架的运行时间

  

public class StAXTest {

    public static void main(String[] args) {
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<work-contact-info>" +
"<Location>Shanghai-shuion-333</Location>" +
"<Postal>200020</Postal>" +
"<Tel><fix>63262299</fix>" +
"<mobile>1581344454</mobile></Tel>" +
"<Appellation>Mr. Wang</Appellation>" +
"</work-contact-info>";
        for (int i = 0; i < 10000; i++) {
            StAX(xml);
        }

        for (int i = 0; i < 10000; i++) {
            SAX(xml);
        }

        for (int i = 0; i < 10000; i++) {
            DOM(xml);
        }

        long current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            StAX(xml);
        }
        current = System.currentTimeMillis() - current;
        System.out.println(current);

        current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
SAX(xml);
        }
        current = System.currentTimeMillis() - current;
        System.out.println(current);

        current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
DOM(xml);
        }
        current = System.currentTimeMillis() - current;
            System.out.println(current);
    }

    private static void StAX(final String xml) {
        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
        InputStream input;
        try {
            input = new ByteArrayInputStream(xml.getBytes());
XMLEventReader xmlEventReader = inputFactory
                .createXMLEventReader(input);
            while (xmlEventReader.hasNext()) {
                XMLEvent event = xmlEventReader.nextEvent();

                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                }

                if (event.isCharacters()) {
                    Characters text = event.asCharacters();
                    if (!text.isWhiteSpace()) {
                    }
                }
            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }

    private static void SAX(final String xml) {
        SAXParserFactory f = SAXParserFactory.newInstance();
        InputStream input;
        try {
            SAXParser p = f.newSAXParser();
            input = new ByteArrayInputStream(xml.getBytes());
            p.parse(input, new DefaultHandler());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void DOM(final String xml) {
        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        InputStream input;
        try {
            DocumentBuilder p = f.newDocumentBuilder();
            input = new ByteArrayInputStream(xml.getBytes());
            p.parse(input);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      得出的数据如下:

2734
4953
6516

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倷绶¢崣搴ㄥ窗閺囩偐鏋庨柕蹇嬪灪婵ジ鏌曡箛瀣偓鏍綖閿燂拷

    濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞閹邦剛鐣洪梺闈浥堥弲婊勬叏濠婂牊鍋ㄦい鏍ㄧ〒閹藉啴鏌熼悜鈺傛珚鐎规洘宀稿畷鍫曞煛閸屾粍娈搁梻浣筋嚃閸ㄤ即宕㈤弽顐ュС闁挎稑瀚崰鍡樸亜閵堝懎濮┑鈽嗗亝濠㈡ê螞濡ゅ懏鍋傛繛鍡樻尭鐎氬鏌嶈閸撶喎顕i渚婄矗濞撴埃鍋撻柣娑欐崌閺屾稑鈹戦崨顕呮▊缂備焦顨呴惌鍌炵嵁鎼淬劌鐒垫い鎺戝鐎氬銇勯弽銊ф噥缂佽妫濋弻鐔碱敇瑜嶉悘鑼磼鏉堛劎绠為柡灞芥喘閺佹劙宕熼鐘虫緰闂佽崵濮抽梽宥夊垂閽樺)锝夊礋椤栨稑娈滈梺纭呮硾椤洟鍩€椤掆偓閿曪妇妲愰弮鍫濈闁绘劕寮Δ鍛厸闁割偒鍋勯悘锕傛煕鐎n偆澧紒鍌涘笧閹瑰嫰鎼圭憴鍕靛晥闂備礁鎼€氱兘宕归柆宥呯;鐎广儱顦伴崕宥夋煕閺囥劌澧ù鐘趁湁闁挎繂妫楅埢鏇㈡煃瑜滈崜姘跺蓟閵娧勵偨闁绘劕顕埢鏇㈡倵閿濆倹娅囨い蹇涗憾閺屾洟宕遍鐔奉伓

    重磅专题
    往期文章
    最新文章